home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 6
/
QRZ Ham Radio Callsign Database - Volume 6.iso
/
mac
/
files
/
t_sys5
/
nosdoc.txt
< prev
next >
Wrap
Internet Message Format
|
1994-11-27
|
23KB
Date: Tue, 22 Nov 88 00:35:09 EST
From: karn@ka9q.bellcore.com (Phil Karn)
To: tcp-group@ucsd.edu
Subject: nos.arc on flash.bellcore.com
I'm uploading the file nos.arc to flash.bellcore.com under the /pub/ka9q
directory. This contains the current source of the new version I've been
working on. Although it is *NOT* yet complete, I thought I should make it
available so people can see how it's shaping up.
Go ahead and give it a try on the Internet. I have NOT yet finished the
implementation of AX.25 sockets, so don't bug me about that part yet.
I know, I know, there's no documentation yet. The main thing you need to know
is that \hosts.net has been replaced with \domain.txt, and the format is
that of a domain server database, not UNIX /etc/hosts.
Phil
Unfortunately, I just haven't had the time to update the documentation
for NOS. Actually, the user interface isn't that much different; the main
difference is the use of a domain resolver. As part of this work I
got rid of hosts.net in favor of a local domain cache called domain.txt.
A word of warning about the domain stuff in NOS: the domain.txt file is
intended only as a local CACHE for the resolver. I have not yet done a
domain SERVER, so the content of domain.txt is not necessarily the same
as you would put in a server database.
This particular version tries to grab 200K from the system at startup time
for the heap; if less is available, it'll get whatever it can. If you
want to use more, modify the call to grabcore() in pc.c. Eventually this
will probably be a easily configurable value.
1. I've made the final switch to Turbo. You need Turbo C 2.0 Professional to
compile and assemble this package from scratch.
2. The command line now accepts several arguments that are best illustrated
by example:
net /m200 /s40 /d\ /autoexec.net
In this case, net is told to grab 200K of memory from MS-DOS for the heap,
to allow a maximum of 40 active sockets, and to make the directory prefix
for all files (configuration, domain.txt, mail spool files, etc) the root.
These particular values all happen to be the defaults for their
corresponding parameters, so of course you'd get the same effect by just
typing "net".
I decided that command line parameters were a better way to go than
environment variables. The latter don't necessarily exist on systems other
than MS-DOS and UNIX. You can always create a batch (shell script) file
to invoke net with the parameters you want.
If you call net with the -d option, you can specify the parent
directory of all the various files used by net.
Interesting. Well, one thing you might try is giving NOS less memory than
the default, which is 200K for the heap. On my 640K system with no major
TSRs running (just MS-DOS, COMMAND.COM and TRW PC-2000 packet driver) this
leaves about 155K unused. (I also have a disk cache and ram disk, but they
all run in extended memory). Depending on what else you might have loaded,
the problem might well be as simple as running out of memory, e.g., if your
driver tries to request memory from DOS when it is all taken but doesn't
bother checking (or behaving rationally) when this happens.
To specify less memory, invoke NOS like this:
net /m100
That would cause it to grab only 100K.
NOS does not deliberately "barf" if it requests more memory space than was
available. It will simply use whatever is available. The only problem this
creates is when you try to shell out to run a subcommand; there won't be
any memory left to run command.com.
2. As you can probably tell from the foregoing example, NET is now large
model by default. The code will still compile and run under small model
if you want. In large model you can use as much memory as the system has
available for buffering, but the downside of this is that there may be none
left for other activities, e.g., running under a multitasker or shelling
to a subprogram. Hence the option of specifying how much memory should
be used. You can now run many more sessions, run much larger windows, etc,
and it all works!
2. The domain receiver task is now started immediately after the very first
"domain addserver" command is executed. This allows subsequent lines in the
autoexec.net file to refer to domain names that aren't yet in domain.txt --
IF sufficient routing entries are already in place to reach the domain
server. Formerly, the use in autoexec.net of any domain name that wasn't
already in domain.txt caused net to hang at startup. Note, however, that
domain.txt still needs a few "seed" entries if you use domain names for
the "ip address" and "domain addserver" commands, or for "route add"
commands necessary to reach the domain server.
The ip address must be set before the first "domain addserver" command.
1. A finger server has been added. It works similarly to the pre-NOS finger
server by KA7AXD *except* that the files under /finger do NOT have ".txt"
appended to them. If you finger "foo@machine.name", finger will send back
the contents of "/finger/foo".
2. I finally got tired of the schizophrenic MS-DOS use of either backslash
(\) or forward slash (/) as the path separator in file names. The code now
deals strictly with forward slashes just as though it's running under UNIX;
MS-DOS system calls that return pathnames now have any backslashes in
their return values immediately converted to forward slashes for consistency.
This requires ONE IMPORTANT CHANGE -- you must edit your /ftpusers file to
change all instances of backslash in the allowable prefix field to forward
slash, or you will not be able to access any files. The symptoms of not
doing this are that you will be allowed to log in via FTP, but every
operation you try will be rejected with a "permission denied" message -- even
if you are supposed to have full access to the system.
3. The session summary command ("session" without arguments) now shows any
active data connections that are associated with FTP sessions.
3. Added the "delete" and "rename" top-level commands.
Lately I've been receiving an increasing number of messages asking
questions about the UNIX ports of my code, particularly Xenix and AT&T
Unix System V (e.g., Microport).
I need to point out a few things:
1. I did not do these ports. In fact, all of my TCP/IP development work
is done on an AT clone running MS-DOS 3.3. That is the ONLY version of
NET about which I can answer questions.
2. As a matter of personal principle, I avoid all AT&T-based UNIX
systems. All of the UNIX systems I use run Berkeley or Berkeley-derived
code (e.g., SunOS, Ultrix). Since all BSD-based UNIX systems already
have full TCP/IP support, there is little reason to run my code on those
systems.
3. Bob Hoffman, hoffman@vax.cs.pittsburgh.edu, has graciously agreed to
act as coordinator of those working with UNIX ports of my code. Please
direct any questions about these versions to him, not to me.
1. The "remote" server and client are completely reworked. The "reset"
and "exit" functions no longer depend on the secrecy of the control port
number, but use a password text string instead. (Not that this makes
things any more secure against someone merely watching the channel, of
course. Someday this will be replaced with a cryptographic
authenticator.)
I did this because I just added a "remote kick" command and I wanted to
make it available to everyone without also making the more disruptive
"exit" and "reset" functions also freely available. I therefore
recommend that people use the default port number (0x1234) whenever
possible.
As before, there are no explicit acknowledgements to any of the "remote"
commands.
Here are a few sample commands:
net> remote pc.ka9q.ampr.org kick
Tell pc.ka9q.ampr.org to kick all TCP connections it has with me.
If there aren't any, do nothing.
net> remote -p 555 pc.ka9q.ampr.org kick
As above, but send the command to UDP port 555 on the remote system.
(You won't have to use this if everybody uses the default port
when starting the remote server.)
net> remote -a ka9q.bellcore.com pc.ka9q.ampr.org kick
Tell pc.ka9q.ampr.org to kick all TCP connections it may have with
ka9q.bellcore.com.
net> remote -k key pc.ka9q.ampr.org exit
Tell the copy of net.exe on pc.ka9q.ampr.org to exit. (If the
specified key is incorrect, the remote system will log that
fact and take no other action, giving you half a chance to detect
nasty people before they do actual damage.) "reset" may be
substituted for "exit"; this causes a cold reboot of the remote
system (MS-DOS only).
net> remote -s mykey
Set the key for the local system's "remote" server. (This command
does not generate any network packets.) NB: Until a key
is set for the local system, it will refuse ALL remote requests
except those for TCP kicks. I.e., you can allow remote kicks
while disallowing remote resets and exits altogether by not
setting a key.
The protocol formats for the new "remote" command are reasonably
backward compatible with the old. The commands are sent in UDP
datagrams, as before, with the first byte of the data field containing
the command (1 == reset, 2 == exit, 3 == kick). In the case of reset or
exit, the variable length key must immediately follow the command byte.
For the kick command, an optional 4-byte target IP address to kick
follows the command byte; there is no key field. If the target IP
address is missing, the system will default to kicking the source
address in the UDP command packet.
This version includes the NET/ROM layer 3 and 4 protocols as integrated
into NOS by SM0RGV. I had to fix a few ANSI function prototypes and delint
a few other places, but I've adopted Anders' code pretty much as is. It
seems to work, although I did notice one occasion that the NET/ROM routing
table got garbled. I would like reports from others on how well this code
works before we put it into wide circulation.
I just fixed a typo in nr3.c that kept IP-over-NET/ROM from working,
and I also added a remote kick feature to SMTP. This latter feature
is coupled with the remote tcp kick server I added the other week,
in that now when you kick a remote station it will not only do a
TCP kick on any existing TCP connections it may have with you, but it
will also run through the SMTP queue and start up a session for anything
that's waiting for you.
This feature should be very useful to those who want to run mail gateways
with manually dialed SLIP links (with Tomcat being the prime example).
All you'll have to do is dial the connection to Tom's machine and send
it the remote kick command (which is encapsulated in a UDP datagram).
His system will then immediately send you any mail it has waiting for you.
I've updated the version of nos on flash. I incorporated some bug fixes to
the NET/ROM socket interface code from Anders, and I added a new command to
the ip layer: "ip rtimer". This allows you to set the IP level reassembly
timeout interval. This is the length of time that IP will keep the fragments
of an incomplete datagram around while waiting for additional fragments to
arrive; the reassembly timer is restarted each time a new fragment arrives.
The timeout value was formerly hard-coded at 30 seconds. This is now the
default for the new command, so if you do nothing the system will continue
to behave exactly as before. NB: the value for rtimer, as with other timer
values, is in MILLISECONDS.
I added this in response to some observations by WB0MPQ that indicated that
IP reassembly timeouts were occurring before subsequent fragments could be
delivered successfully over a NET/ROM network (yes, it's really that slow).
But be careful: if you set the timeout too long and you get a lot of
fragmentary datagrams that never complete, you'll tie up a lot of memory.
I'm uploading the version of NOS on flash.bellcore.com. This version
supports RIP, the interior routing protocol made popular by Berkeley UNIX.
To enable the reception of RIP broadcasts, merely say
start rip
If you're not acting as a gateway to anyone, this is all you need do -- your
system will begin to passively monitor its interfaces for broadcast routing
packets and it will automatically add routes to the routing table. It may
take up to 30 seconds on an ethernet for the table to be built (this assumes
a broadcast rate of 30 seconds, which is standard on Ethernet). If you want
to get started faster, you can give an optional IP address to the command:
start rip [128.96.160.0]
This broadcasts a RIP "request" packet on the local subnet, which triggers
each gateway within earshot to send you its routing tables. (This requires
knowledge of the local IP broadcast address, plus an ARP entry for same.
Read on to find out about both of these things.)
If you are also acting as a gateway, then you'll want to enable the transmit
routines. First add ARP entries that map the local broadcast address for
each of your networks to the correct hardware address. For example, the IP
broadcast address on my shack Ethernet is 128.96.160.0, so I include the
line
arp add [128.96.160.0] ethernet ff:ff:ff:ff:ff:ff
in my /autoexec.net file. Then I enable the broadcasting of routing info
with the line
rip add [128.96.160.0] ethernet 30 6
This means "broadcast your routing tables every 30 seconds on the interface
named 'ethernet', using IP destination address 128.96.160.0. Generate
triggered updates as necessary, and use the split horizon method."
On a packet radio channel, I might use the following lines:
arp add [44.64.0.0] com1 qst-0
rip add [44.64.0.0] com1 600 7
The last parameter in the "rip add" command is the flag parameter. It is the
sum of the following possible flag values:
1 - Include a host-specific route to yourself in each update. (Not needed
if you're already advertising a route to the network you're on.)
2 - Use split horizon updating; that is, omit all routing entries that
point to the interface being used for the broadcast. (This reduces the
chances of routing loops forming).
4 - Generate triggered updates as necessary on this interface, i.e.,
whenever a metric changes in the routing table, immediately generate
a broadcast on this interface with the changed entries. If split horizon
(bit 2) is also set, use "poisoned reverse", i.e., for any routing
table entries that point to this interface, include them with an
infinite metric (RIP defines 16 to be infinity) instead of leaving them
out as happens during a normal routing broadcast when split horizon
is set. Triggered updates helps spread the word faster when links
fail, reducing the chances of a temporary loop forming.
For Ethernet, I recommend a flag value of 6 (triggered updates and split
horizon). On SLIP links, use 6 or 7, depending on whether you need to
emit a host-specific route to yourself. On a packet radio channel where
everyone is not fully connected (the usual case), use 7 and DON'T advertise
any routes to the subnet unless you can reach everyone in that subnet.
(A packet radio channel is best modeled as a collection of point-to-point
links since it rarely fits the model of a fully interconnected subnet
like Ethernet.) Note that you don't have to broadcast your routes; you
can direct them to a specific set of stations by using their names or
addresses in the "rip add" command. You can have any number of such
commands per interface, with the only limit being channel traffic overhead.
An experimental parameter is available to control something I call "route
merging". If you say "rip merge on", then an incoming route that is more
specific than one you already have in your table is ignored if they both
point to the same gateway. For example, if you already have a default route
that points to gateway "foobar", then any route that arrives from gateway
foobar will be ignored because to put it in the table would not cause any
change in the routing of packets -- they'd still go to foobar anyway.
Properly used, this should save a lot of routing table space.
You can trace the automatic routing messages and controls by the "rip trace"
command; it takes a numeric parameter. "rip trace 0" disables tracing, "rip
trace 1" generates messages only when routes change, and "rip trace 2" shows
you everything, even when things are stable.
If you want to ignore routing broadcasts from a certain gateway (e.g.,
because it can't hear you), say
rip refuse hostname
where 'hostname' is the domain name or [ip address] of the offending
gateway. To reverse this, just say
rip accept hostname
This manual filtering will probably do until I'm able to devise some sort of
link connectivity algorithm and protocol that can analyze the quality of the
path between your station and each of your neighbors so routing packets can
be filtered automatically. I have an idea of how to do this -- by
broadcasting periodic status packets containing received and transmitted
packet count statistics and using such packets to determine how well you're
being heard.
Ooops, I think I made a minor error in my discussion of RIP over radio. The
flag setting for RIP broadcasts over a radio channel should probably be 5,
not 7. You don't want to use split horizon over a radio subnetwork unless it
is internally fully connected, since there may well be relay routes that
enter and leave an intermediate station by the same interface. Split horizon
would suppress such routes, which would preclude same-channel relay hops.
I've updated the NOS code on flash. I've been doing a lot of work on the
RIP code to fix bugs and make things more stable. I changed the command
syntax for a couple of the rip commands; look at the help messages or
read the source for details until I can document things further.
Note! This version REQUIRES that you set the default local IP address (i.e.,
issue the "ip addr" command) BEFORE you attach any interfaces. So edit your
autoexec.net file appropriately.
The reason for this requirement is the major change in this version: each
interface can now have its own IP address. An interface's IP address can be
specified in the attach command, but if it is omitted the IP address given
earlier in the "ip address" command will be used by default. (Hence the
requirement given above. I considered doing away with the "ip address"
command altogether and making the ip address argument on each attach command
required, but this would have been a more disruptive change.)
This architectural change brings the NET package into line with standard
Internet practice. This is mainly for the benefit of those who use NET as a
router between Ethernets in a regular Internet environment, where the other
hosts and routers lack NET's extensions to the standard Internet routing and
subnetting facilities. Although it was possible to make the earlier code
work in such situations through a combination of proxy arp and static
routes, it was a little unclean. With this version, the machine can be set
up to act just like a conventional Internet router and multi-homed host.
I.e., if you have NET running with several interfaces, each with its own
unique IP address, the system will accept packets addressed to any of its
interfaces' addresses. When the system originates packets, the local address
appropriate for the sending interface will be used, all in accordance with
standard Internet practice. Note that when you do a "tcp stat" the local IP
addresses for connections in LISTEN state are 0.0.0.0; this is normal. The
appropriate IP address is used when the connection is actually opened. The
BSD constant "INADDR_ANY" is provided in a header file, and it can be used
just as it is in BSD when binding local socket addresses in an application.
Note that you are definitely NOT required to have a unique IP address for
each interface. If you specify the same IP address for each interface (or
allow each interface to use the global default set with the "ip address"
command), then the package behaves just as it did before. Therefore this
change is largely irrelevant to most AMPRNET users. It is also irrelevant
whose NET configurations have only a single interface (i.e., all end-user
systems that don't operate as gateways).
I've added a new command, "iface", that lists the interfaces on the system
along with their parameters (e.g., IP address, send and receive packet
counts, etc.) There's also a "domain listservers" command that displays
the list of domain servers along with various statistics measured for each.
Subject: lost first characters
I haven't investigated Tom's specific problem, but I've seen similar
things in the past and it's almost always been due to null characters
inbedded in the stream being sent to the terminal. The ANSI.SYS and
NANSI.SYS drivers both display a null (0) character exactly as though
it were a space, and this I consider a bug. Every other terminal I've
ever seen treats null as a no-op. One of these days I'll dig into
the NANSI.SYS source and fix it.
1. KY3B's port of PE1CHL's generic 8530 driver. Ken did all the work of
porting Rob's driver to NOS. I took his code, reformatted and delinted it a
bit and added ANSI-style function prototypes, but I have not actually tested
it. Those of you using DRSI cards with slow speed modems, please give this
driver a try and let us know if it works. There's a flag in config.h for
configuring out this code if you don't need it and want to save the space.
2. I added an option in config.h for turning off the mailbox code. When the
mailbox has been configured out, the following commands are removed:
mbox
start telnet/netrom/ax25
stop telnet/netrom/ax25
The "mbox y" command is gone. It didn't seem to make sense to keep it around
given the presence of a separate "ttylink" server that goes straight to the
console. So whenever the mailbox is configured into the system the telnet,
netrom and ax25 servers all get the mailbox automatically. One less thing
you have to remember to put in your autoexec.net files...
I'm currently updating the NOS on flash. This incorporates the latest mbox
and netrom patches by Anders, the latest DRSI driver from Stu, and the
vector-saving fix to ec.c suggested by Ron Henderson. The only change I
made myself was to add an #ifdef MAILBOX in fingerd.c around a reference
to the mailbox code.